# SerialData 串口接收函数类
from machine import UART # type: ignore
import json,sensor # type: ignore

class SerialData:
    def __init__(self,uart):
        self.uart = uart
        self.qrcode = 0
        self.point = 0
        self.number = 0
        self.lineMode = 1

    '''接收串口数据函数(返回1表示有数据,返回0表示未接收到数据)'''
    def getUartData(self):
        size = self.uart.any()  #获取接收数据的大小
        if (size != 0):
            a = self.uart.read(1)   # 加上decode变成字符串
            print(a)
            b = ord(a)   # 将编码转化为hex
            #   b = json.loads(a)  # 将接收的数据转化为json,用不到

            c = b & 0x03    # 先查看后两位检测是否需要找点
            # 查看是否需要找点并查找找点模式
            if(c == 0x02):
                self.point = 1  # 表示需要短距离找点
            elif(c == 0x01):
                self.point = 2  # 表示需要中距离找点
            elif(c == 0x03):
                self.point = 3  # 表示需要远距离找点
            else:
                self.point = 0
 
            c = b & 0xFC    # 再查看前六位检测其他模式
            # 查看是否需要二维码扫描
            if(c == 0x70):
                self.qrcode = 1     # 表示二维码扫描
                sensor.reset()
                sensor.set_framesize(sensor.QVGA)
                sensor.set_pixformat(sensor.GRAYSCALE)
            elif(self.qrcode != 0):
                self.qrcode = 0
                sensor.reset()
                sensor.set_pixformat(sensor.RGB565)
                sensor.set_framesize(sensor.QQVGA)
                sensor.set_auto_whitebal(True)
                sensor.skip_frames(time = 100)

            # 查看是否需要数字识别
            if(c == 0x0C):
                self.number = 1
            else:
                self.number = 0

            # 查看巡线模式
            if(c == 0x04):
                self.lineMode = 1   # 正常模式
            elif(c == 0x08):
                self.lineMode = 2   # 桥上模式
            elif(c == 0x10):
                self.lineMode = 3   # 倒车模式
            elif(c == 0x20):
                self.lineMode = 4   # 跷跷板模式
            elif(c == 0x40):
                self.lineMode = 5   # 右抓线模式
            elif(c == 0x44):
                self.lineMode = 6   # 左抓线模式
            elif(c == 0x24):
                self.lineMode = 7   # 平台矫正模式
            elif(c == 0x60):
                self.lineMode = 8   # 山丘矫正模式
            elif(c == 0x50):
                self.lineMode = 9   # 刀山模式
            elif(c == 0x28):
                self.lineMode = 10  # 获取距离模式(点模式)
            elif(c == 0x38):
                self.lineMode = 11  # 获取距离模式(障碍模式)
            self.toRespond()
            return 1    # 返回1表示有数据
        else:
            return 0    # 返回0表示未接收到数据

    '''回应主机表示已收到,不需要自己调用,getUartData()会自动调用'''
    def toRespond(self):
        obj = {
            "msg":1
        }
        self.uart.write(json.dumps(obj))

    '''发送数据,第一个为line,第二个为node,不定长参数,点可以有,也可以没有'''
    def toSendData(self, **vartuple):
        obj = {}
        for x,y in vartuple.items():
            obj[x] = y
        self.uart.write(json.dumps(obj))

    '''发送数字识别信息,第一个为左边的数字,第二个为右边的数字'''
    def toSendNumber(self,left,right):
        obj = {
            "left":left,
            "right":right
        }
        self.uart.write(json.dumps(obj))

    '''是否扫描二维码,返回1表示扫描,返回0表示不扫描'''
    def toSearchqrcode(self):
        return self.qrcode

    '''是否找点,返回1表示近距离找点,返回2表示中距离找点,返回3表示远距离找点,返回0表示不找点'''
    def toFindPoint(self):
        return self.point

    '''是否需要数字识别,返回1表示需要,返回0表示不需要'''
    def toIdentifyNumber(self):
        return self.number

    ''' 返回巡线模式
        findLineMode = 1 正常模式
                     = 2 桥上模式
                     = 3 倒车模式
    '''
    def getFindLineMode(self):
        return self.lineMode

    def changeFindLineMode(self,mode):
        self.lineMode = mode

''' 示例
import sensor, image, time, json, pyb
from machine import UART
from SerialData import SerialData

uart1 = UART(1,115200)
uart2 = UART(2,115200)

uart1data = SerialData(uart1)
uart2data = SerialData(uart2)

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
#    print(clock.fps())

    uart1data.getUartData()

#    obj = {
#           "name" : "Backsoon",
#           "edge" : 12
#           }
#    uart1.write(json.dumps(obj))

    print(f"search qrcode:{uart1data.toSearchqrcode()}\n"+\
          f"find point:{uart1data.toFindPoint()}\n"     +\
          f"find line mode:{uart1data.getFindLineMode()}\n")
    pyb.delay(1000)
'''
